import tkinter as tk  # 导入标准图形用户界面库，用于创建图形用户界面。
from tkinter import filedialog  # 导入文件对话框模块，用于选择文件。
from PIL import Image, ImageTk  # 导入Python图像处理库，提供图像处理功能。
import numpy as np  # 导入NumPy库，用于数组和矩阵操作。
from util import preprocess_image, load, get  # 从util模块导入所需的函数。
import yaml  # 导入YAML库，用于读取和解析YAML文件。
from tensorflow.keras.applications.vgg16 import VGG16  # 导入VGG16模型

# 从配置文件获取字体样式列表和新图像大小
char_styles = get('char_styles')  # 获取字体样式列表
new_size = get('new_size')  # 获取新的图像大小

# 加载预训练的VGG16模型，不包括顶部的全连接层
vgg_model = VGG16(weights='imagenet', include_top=False)

class ImageClassifierApp:
    def __init__(self, model_path):
        # 使用util.load加载最佳模型
        self.model = load("最佳模型", model_path)

        # 创建主窗口
        self.root = tk.Tk()
        self.root.title('Image Classifier')  # 设置窗口标题
        self.root.geometry("300x200")  # 设置窗口大小

        # 创建一个按钮用于选择图像
        self.button = tk.Button(self.root, text='选择图像', command=self.select_image)
        self.button.pack()  # 将按钮添加到窗口

        # 创建一个标签用于显示图像
        self.image_label = tk.Label(self.root)
        self.image_label.pack()  # 将图像标签添加到窗口

        # 创建一个标签用于显示预测的类别
        self.prediction_label = tk.Label(self.root)
        self.prediction_label.pack()  # 将预测标签添加到窗口

        # 启动GUI事件循环
        self.root.mainloop()

    def select_image(self):
        # 打开文件对话框以选择图像
        image_path = filedialog.askopenfilename()

        if image_path:
            # 使用util的preprocess_image函数预处理图像
            img_array = preprocess_image(image_path, new_size, vgg_model)  # 预处理图像

            # 使用加载的最佳模型执行推理
            predicted_class = self.model.predict([img_array])  # 预测类别

            # 用PIL读取图像，并设置读取图像后的窗口的大小
            
            pil_image = Image.open(image_path)
            pil_image = pil_image.resize((150, 150), Image.LANCZOS)  # 调整图像大小

            # 将PIL图像转换为PhotoImage并更新标签
            image_tk = ImageTk.PhotoImage(pil_image)
            self.image_label.config(image=image_tk)  # 更新图像标签
            self.image_label.image = image_tk

            # 更新预测标签，显示预测的字体样式
            self.prediction_label.config(text=f'预测类别: {char_styles[predicted_class[0]]}')

# 启动应用程序
app = ImageClassifierApp("E:/桌面/zy/shufa_app/models/best_model.pkl")
